import pandas as pd
import requests
import time
import random
import logging

# 配置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# 设置最大重试次数
MAX_RETRIES = 3
# 设置请求超时时间
TIMEOUT = 10
# 设置请求头，模拟浏览器行为
HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}

def check_ip_availability(ip):
    """
    检查IP是否可用，通过向百度发送请求，查看返回状态码是否为200
    """
    try:
        # 验证IP格式
        if not ip or '.' not in ip:
            logger.warning(f"无效的IP格式: {ip}")
            return False
            
        proxies = {
            'http': f'http://{ip}',
            'https': f'https://{ip}'
        }
        
        for retry in range(MAX_RETRIES):
            try:
                # 使用代理IP发送请求到百度
                response = requests.get('https://www.baidu.com', 
                                      proxies=proxies, 
                                      headers=HEADERS, 
                                      timeout=TIMEOUT, 
                                      allow_redirects=True)
                
                # 检查状态码
                if response.status_code == 200:
                    logger.info(f"IP {ip} 可用，状态码: {response.status_code}")
                    return True
                else:
                    logger.warning(f"IP {ip} 不可用，状态码: {response.status_code}")
                    return False
                    
            except requests.exceptions.RequestException as e:
                logger.error(f"IP {ip} 检查失败 (尝试 {retry+1}/{MAX_RETRIES}): {str(e)}")
                # 如果不是最后一次重试，则等待一段时间后重试
                if retry < MAX_RETRIES - 1:
                    # 随机等待1-3秒，避免频繁请求
                    wait_time = random.uniform(1, 3)
                    logger.info(f"等待 {wait_time:.2f} 秒后重试...")
                    time.sleep(wait_time)
    except Exception as e:
        logger.error(f"检查IP {ip} 时发生错误: {str(e)}")
    
    return False

def main():
    try:
        logger.info("开始IP可用性检查程序")
        
        # 读取Excel文件
        file_path = 'c:\\Users\\Administrator\\Desktop\\ip_pool\\ip_detail.xlsx'
        logger.info(f"尝试读取Excel文件: {file_path}")
        
        # 尝试使用不同的引擎读取
        try:
            df = pd.read_excel(file_path, engine='openpyxl')
        except Exception as e:
            logger.warning(f"使用openpyxl引擎读取失败: {str(e)}，尝试使用xlrd")
            try:
                df = pd.read_excel(file_path, engine='xlrd')
            except Exception as e2:
                logger.error(f"使用xlrd引擎读取也失败: {str(e2)}")
                # 尝试安装xlrd
                logger.info("尝试安装xlrd库")
                import subprocess
                subprocess.check_call(["pip", "install", "xlrd"])
                df = pd.read_excel(file_path, engine='xlrd')
        
        logger.info("成功读取Excel文件")
        
        # 假设IP在第一列，获取列名
        ip_column = df.columns[0]
        logger.info(f"使用列 '{ip_column}' 作为IP地址列")
        
        # 创建一个空列表来存储可用的IP
        available_ips = []
        
        # 遍历所有IP进行检查
        total_ips = len(df)
        logger.info(f"开始检查 {total_ips} 个IP地址...")
        
        # 先打印前几行数据，用于调试
        logger.info(f"Excel文件前5行数据:\n{df.head()}")
        
        for index, row in df.iterrows():
            try:
                ip = str(row[ip_column]).strip()
                logger.info(f"检查 IP {index+1}/{total_ips}: {ip}")
                
                if check_ip_availability(ip):
                    available_ips.append(ip)
                
                # 在IP检查之间添加随机延迟，避免过快请求
                if index < total_ips - 1:
                    delay = random.uniform(0.5, 2)
                    time.sleep(delay)
            except Exception as e:
                logger.error(f"处理第 {index+1} 行时发生错误: {str(e)}")
                continue
        
        # 创建包含可用IP的DataFrame
        result_df = pd.DataFrame(available_ips, columns=['Available_IP'])
        
        # 保存到新的Excel文件
        output_file = 'c:\\Users\\Administrator\\Desktop\\ip_pool\\available_ips.xlsx'
        result_df.to_excel(output_file, index=False)
        
        logger.info("\n检查完成！")
        logger.info(f"总检查IP数量: {total_ips}")
        logger.info(f"可用IP数量: {len(available_ips)}")
        logger.info(f"可用IP已保存到: {output_file}")
        
    except Exception as e:
        logger.error(f"发生错误: {str(e)}", exc_info=True)

if __name__ == "__main__":
    main()